use std::net::UdpSocket;
use std::str;

fn main() -> std::io::Result<()> {
    println!("UDP 回声服务器启动");
    println!("监听地址: 127.0.0.1:5051");
    println!("---------------");
    
    // 绑定到本地地址的5050端口
    let socket = UdpSocket::bind("127.0.0.1:5051")?;
    println!("服务器已绑定到端口 5051");
    
    // 缓冲区用于接收数据
    let mut buf = [0; 512];
    
    loop {
        // 接收数据报
        match socket.recv_from(&mut buf) {
            Ok((size, src)) => {
                // 将接收到的数据转换为字符串
                let received = match str::from_utf8(&buf[..size]) {
                    Ok(s) => s,
                    Err(e) => {
                        eprintln!("无效的UTF-8序列: {}", e);
                        continue;
                    }
                };
                
                println!("来自 {} 的数据: {}", src, received);
                
                // 检查是否是退出命令
                if received.trim() == "/quit" {
                    println!("客户端 {} 请求断开", src);
                    continue; // 继续等待其他客户端
                }
                
                // 将数据发送回客户端
                if let Err(e) = socket.send_to(&buf[..size], src) {
                    eprintln!("发送回客户端失败: {}", e);
                } else {
                    println!("向客户端 {} 发送回数据: {}", src, received);
                }
            }
            Err(e) => {
                eprintln!("接收数据失败: {}", e);
                break;
            }
        }
    }
    
    Ok(())
}